home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / os2 / pccts.zip / CODE.C < prev    next >
C/C++ Source or Header  |  1992-12-08  |  4KB  |  149 lines

  1. /*
  2.  * Simple code generator for PCCTS 1.00 tutorial
  3.  *
  4.  * Terence Parr
  5.  * Purdue University
  6.  * Electrical Engineering
  7.  * March 19, 1992
  8.  */
  9. #include <stdio.h>
  10. #include "sym.h"
  11. #include "charbuf.h"
  12. #define AST_FIELDS int token, level, offset; char str[D_TextSize];
  13. #define zzcr_ast(ast,attr,tok,text) create_ast(ast,attr,tok,text)
  14. #include "antlr.h"
  15. #include "ast.h"
  16. #include "tokens.h"
  17. #include "dlgdef.h"
  18. #include "mode.h"
  19. #define GLOBAL              0
  20. #define PARAMETER           1
  21. #define LOCAL               2
  22.  
  23. static int LabelNum=0, GenHeader=0;
  24.  
  25. #define DONT_CARE            0
  26. #define SIDE_EFFECTS        1
  27. #define VALUE                2
  28.  
  29. gen(t,emode)
  30. AST *t;
  31. int emode;    /* evaluation mode member { SIDE_EFFECTS, VALUE, DONT_CARE } */
  32. {
  33.     AST *func, *arg, *locals, *slist, *a, *opnd1, *opnd2, *lhs, *rhs;
  34.     int n;
  35.  
  36.     if ( t == NULL ) return;
  37.     if ( !GenHeader ) { printf("#include \"sc.h\"\n"); GenHeader=1; }
  38.  
  39.     switch ( t->token )
  40.     {
  41.     case DefineFunc :
  42.         func = zzchild(t);
  43.         arg = zzchild( zzsibling(func) );
  44.         locals = zzchild( zzsibling( zzsibling(func) ) );
  45.         slist = zzsibling( zzsibling( zzsibling(func) ) );
  46.         if ( strcmp(func->str, "main") == 0 )
  47.             printf("_%s()\n{\n\tBEGIN;\n", func->str);
  48.         else
  49.             printf("%s()\n{\n\tBEGIN;\n", func->str);
  50.         for (a=locals; a!=NULL; a = zzsibling(a)) printf("\tLOCAL;\n");
  51.         gen( slist, DONT_CARE );
  52.         printf("\tEND;\n}\n");
  53.         break;
  54.     case SLIST :
  55.         for (a=zzchild(t); a!=NULL; a = zzsibling(a))
  56.         {
  57.             gen( a, EvalMode(a->token) );
  58.             if ( a->token == Assign ) printf("\tPOP;\n");
  59.         }
  60.         break;
  61.     case DefineVar :
  62.         printf("SCVAR %s;\n", zzchild(t)->str);
  63.         break;
  64.     case Mul :
  65.     case Div :
  66.     case Add :
  67.     case Sub :
  68.     case Equal :
  69.     case NotEqual :
  70.         opnd1 = zzchild(t);
  71.         opnd2 = zzsibling( opnd1 );
  72.         gen( opnd1, emode );
  73.         gen( opnd2, emode );
  74.         if ( emode == SIDE_EFFECTS ) break;
  75.         switch ( t->token )
  76.         {
  77.         case Mul : printf("\tMUL;\n"); break;
  78.         case Div : printf("\tDIV;\n"); break;
  79.         case Add : printf("\tADD;\n"); break;
  80.         case Sub : if ( opnd2==NULL ) printf("\tNEG;\n");
  81.                    else printf("\tSUB;\n");
  82.                    break;
  83.         case Equal : printf("\tEQ;\n"); break;
  84.         case NotEqual : printf("\tNEQ;\n"); break;
  85.         }
  86.         break;
  87.     case If :
  88.         a = zzchild(t);
  89.         gen( a, VALUE );                /* gen code for expr */
  90.         n = LabelNum++;
  91.         printf("\tBRF(iflabel%d);\n", n);
  92.         a = zzsibling(a);
  93.         gen( a, EvalMode(a->token) );    /* gen code for statement */
  94.         printf("iflabel%d: ;\n", n);
  95.         break;
  96.     case While :
  97.         a = zzchild(t);
  98.         n = LabelNum++;
  99.         printf("wbegin%d: ;\n", n);
  100.         gen( a, VALUE );                /* gen code for expr */
  101.         printf("\tBRF(wend%d);\n", n);
  102.         a = zzsibling(a);
  103.         gen( a, EvalMode(a->token) );    /* gen code for statement */
  104.         printf("\tBR(wbegin%d);\n", n);
  105.         printf("wend%d: ;\n", n);
  106.         break;
  107.     case Return :
  108.         gen( zzchild(t), VALUE );
  109.         printf("\tRETURN;\n");
  110.         break;
  111.     case Print :
  112.         gen( zzchild(t), VALUE );
  113.         printf("\tPRINT;\n");
  114.         break;
  115.     case Assign :
  116.         lhs = zzchild(t);
  117.         rhs = zzsibling( lhs );
  118.         gen( rhs, emode );
  119.         printf("\tDUP;\n");
  120.         if ( lhs->level == GLOBAL ) printf("\tSTORE(%s);\n", lhs->str);
  121.         else printf("\tLSTORE(%d);\n", lhs->offset);
  122.         break;
  123.     case VAR :
  124.         if ( emode == SIDE_EFFECTS ) break;
  125.         if ( t->level == GLOBAL ) printf("\tPUSH(%s);\n", t->str);
  126.         else printf("\tLPUSH(%d);\n", t->offset);
  127.         break;
  128.     case FUNC :
  129.         gen( zzchild(t), VALUE );
  130.         printf("\tCALL(%s);\n", t->str);
  131.         break;
  132.     case STRING :
  133.         if ( emode == SIDE_EFFECTS ) break;
  134.         printf("\tSPUSH(%s);\n", t->str);
  135.         break;
  136.     default :
  137.         printf("Don't know how to handle: %s\n", zztokens[t->token]);
  138.         break;
  139.     }
  140. }
  141.  
  142. EvalMode( tok )
  143. int tok;
  144. {
  145.     if ( tok == Assign || tok == If || tok == While ||
  146.          tok == Print || tok == Return ) return VALUE;
  147.     else return SIDE_EFFECTS;
  148. }
  149.